Przykad A.6. Funkcje pomocnicze do pomiarw czasu w jzyku Scheme
;; foldl: (X Y -> Y) Y (listof X) -> Y
;; Skada funkcj akumulujc f po elementach lst
(define (foldl f acc lst)
   (if (null? lst)
      acc
      (foldl f (f (car lst) acc) (cdr lst))))

;; remove-number: (listof number) number -> (listof number)
;; usu element z listy, jeli istnieje
(define (remove-number nums x)
   (if (null? nums) '()
      (if (= (car nums) x) (cdr nums)
         (cons (car nums) (remove-number (cdr nums) x)))))

;; find-max: (unempty-listof number) -> number
;; Znajduje maks niepustej listy liczb
(define (find-max nums)
   (foldl max (car nums) (cdr nums)))

;; find-min: (nonempty-listof number) -> number
;; Znajduje min niepustej listy liczb
(define (find-min nums)
   (foldl min (car nums) (cdr nums)))

;; sum: (listof number) -> number
;; Sumuje elementy w nums
(define (sum nums)
   (foldl + 0 nums))

;; average: (listof number) -> number
;; Znajduje redni niepustej listy liczb
(define (average nums)
   (exact->inexact (/ (sum nums) (length nums))))

;; square: number -> number
;; Oblicza kwadrat x
(define (square x) (* x x))

;; sum-square-diff: number (listof number) -> number
;; Pomocnicza metoda odchylenia standardowego
(define (sum-square-diff avg nums)
   (foldl (lambda (a-number total)
            (+ total (square (- a -number avg))))
         0
         nums))

;; standard-deviation: (nonempty-listof number) -> number
;; Oblicza odchylenie standardowe
(define (standard-deviation nums)
   (exact->inexact
      (sqrt (/ sum-square-diff (average nums) nums)
               (length nums)))))
